#include "keydebounce.h"
#include "gpio.h"
#include "int.h"
#include "beep.h"

void Key_Init(void)
{
    //1. 按键接UART1_CTS引脚,将其复用为GPIO1_IO18引脚
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);
    //2. 设置GPIO1_IO18引脚的电气属性
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);
    //3. 配置引脚为输入引脚或输出引脚以及中断触发方式
    GPIO_Config GPIO_InitStruct;
    GPIO_InitStruct.direction=input;
    GPIO_InitStruct.IRQMode=GPIO_INT_FALLING_EDGE;
    GPIO_Init(GPIO1,18,&GPIO_InitStruct);
    //4. 注册中断处理函数
    BindIRQTable(GPIO1_Combined_16_31_IRQn,KeyIRQHandler,NULL);
    //5. GIC模块中断使能
    GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);
    //6. GPIO模块中断使能
    GPIO_EnableIRQ(GPIO1,18);
}

//value为EPIT模块中LR寄存器的设定值,分频系数默认为1分频
void Timer_Init(unsigned int value)
{
    // 1. 关闭EPIT1模块 bit[0]:0
    EPIT1->CR &= ~(0x1);

    // 2. 选取EPIT定时器的时钟源为IPG_CLK bit[25:24]
    EPIT1->CR &= ~(0x3<<24);
    EPIT1->CR |= (0x1<<24);

    // 3. 设置分频系数为1分频 bit[15:4]
    EPIT1->CR &= ~(0xFFF<<4);

    // 4. 设置EPIT的工作模式为自动重载模式(set-and-forget) bit[3]
    EPIT1->CR |= (0x1<<3);

    // 5. 设置初始值来源为EPIT1_LR寄存器 bit[1]
    EPIT1->CR |= (0x1<<1);

    // 6. 使能比较中断 bit[2]
    EPIT1->CR |= (0x1<<2);

    // 7. 配置LR寄存器的值为value
    EPIT1->LR=value;

    // 8. 配置CMPR寄存器的值
    EPIT1->CMPR=0;

    // 9.注册中断向量表
    BindIRQTable(EPIT1_IRQn,TimerIRQHandler,NULL);

    // 10. 使能GIC
    GIC_EnableIRQ(EPIT1_IRQn);
}

void Timer_Restart(unsigned int value)
{
    // 1. 关闭定时器
    EPIT1->CR &= ~(0x1<<0);

    // 2. 定时器LR寄存器赋予初值
    EPIT1->LR =value;

    // 3. 开启定时器
    EPIT1->CR |= (0x1<<0);
    
}
void TimerIRQHandler(unsigned int id,void* para)
{
    static unsigned char state=OFF;

    if((EPIT1->SR)&(0x1<<0))
    {
        // 1. 关闭定时器
        EPIT1->CR &= ~(0x1<<0);
        // 2. 读取按键状态确认按键是否保持按下
        if(GPIO_Read(GPIO1,18)==0)
        {
            state = !state;
            Beep_Toggle(state);
        }
    }

    //3. 清除输出比较中断标志位
    EPIT1->SR |= (0x1<<0);
}

void KeyIRQHandler(unsigned int id,void* para)
{
    //1. 开启中断定时器
    Timer_Restart(660000);//10ms
    //2. 清除按键中断
    GPIO_ClearIRQFlag(GPIO1, 18);
}









